package com.bestcem.xm.ticket.service.manager.notify;

import com.bestcem.xm.ticket.enums.TicketNotifyConfigEventEnum;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 飞书通知模板
 * https://open.feishu.cn/tool/cardbuilder?from=dochomepage
 * https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/im-v1/message/create_json
 *
 * @author XiaoYunSong <ys.xiao@idiaoyan.com>
 * @version 1.0
 * @date 2022/2/21 17:23
 **/

@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Slf4j
public class FeishuTemplate {

    /**
     * 收到工单
     */
    private static final String CREATED_TICKET = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"收到工单通知\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}收到新的工单\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发条件名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${触发条件名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 工单即将逾期
     */
    private static final String FOLLOW_REMIND = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"工单即将逾期\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}工单即将逾期\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发条件名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${触发条件名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 工单逾期
     */
    private static final String FOLLOW_OVERDUE = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"工单已经逾期\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}工单已经逾期\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发条件名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${触发条件名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 收到预警
     */
    private static final String ONLY_NOTIFY = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { \"tag\":" +
            " \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"收到预警通知\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}收到新的预警\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"预警编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发规则：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发条件名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${触发条件名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理预警\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";


    /**
     * 收到工单; 无触发条件字段
     */
    private static final String CREATED_TICKET_NONE = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"收到工单通知\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}收到新的工单\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 工单即将逾期; 无触发条件字段
     */
    private static final String FOLLOW_REMIND_NONE = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"工单即将逾期\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}工单即将逾期\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 工单逾期; 无触发条件字段
     */
    private static final String FOLLOW_OVERDUE_NONE = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"工单已经逾期\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}工单已经逾期\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"工单编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"处理逾期时间：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${处理逾期时间}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"规则/工单名称：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理工单\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";
    /**
     * 收到预警; 无触发条件字段
     */
    private static final String ONLY_NOTIFY_NONE = "{ \"config\": { \"wide_screen_mode\": false }, \"elements\": [ { " +
            "\"tag\": \"div\", \"text\": { \"tag\": \"lark_md\", \"content\": \"收到预警通知\" }, \"fields\": [ { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"${项目名称}收到新的预警\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"预警编号：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${编号}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"触发规则：\" } }, { \"is_short\": true, \"text\": { \"tag\": \"lark_md\", \"content\": \"${规则/工单名称}\" } }, { \"is_short\": false, \"text\": { \"tag\": \"lark_md\", \"content\": \"\" } } ] }, { \"tag\": \"action\", \"actions\": [ { \"tag\": \"button\", \"text\": { \"tag\": \"plain_text\", \"content\": \"查看/处理预警\" }, \"type\": \"primary\", \"url\": \"${工单预警详情链接}\" } ] } ] }";


    /**
     * 工单事件对应模板
     */
    private static final Map<TicketNotifyConfigEventEnum, String> FEISHU_TEMPLATE_MAP = new HashMap<>();

    static {
        FEISHU_TEMPLATE_MAP.put(TicketNotifyConfigEventEnum.CREATED_TICKET, CREATED_TICKET);
        FEISHU_TEMPLATE_MAP.put(TicketNotifyConfigEventEnum.CHANGE_FOLLOW, CREATED_TICKET);
        FEISHU_TEMPLATE_MAP.put(TicketNotifyConfigEventEnum.FOLLOW_REMIND, FOLLOW_REMIND);
        FEISHU_TEMPLATE_MAP.put(TicketNotifyConfigEventEnum.FOLLOW_OVERDUE, FOLLOW_OVERDUE);
        FEISHU_TEMPLATE_MAP.put(TicketNotifyConfigEventEnum.ONLY_NOTIFY, ONLY_NOTIFY);
    }

    /**
     * 工单事件对应模板; 无触发条件字段
     */
    private static final Map<TicketNotifyConfigEventEnum, String> FEISHU_TEMPLATE_MAP_NONE = new HashMap<>();

    static {
        FEISHU_TEMPLATE_MAP_NONE.put(TicketNotifyConfigEventEnum.CREATED_TICKET, CREATED_TICKET_NONE);
        FEISHU_TEMPLATE_MAP_NONE.put(TicketNotifyConfigEventEnum.CHANGE_FOLLOW, CREATED_TICKET_NONE);
        FEISHU_TEMPLATE_MAP_NONE.put(TicketNotifyConfigEventEnum.FOLLOW_REMIND, FOLLOW_REMIND_NONE);
        FEISHU_TEMPLATE_MAP_NONE.put(TicketNotifyConfigEventEnum.FOLLOW_OVERDUE, FOLLOW_OVERDUE_NONE);
        FEISHU_TEMPLATE_MAP_NONE.put(TicketNotifyConfigEventEnum.ONLY_NOTIFY, ONLY_NOTIFY_NONE);
    }

    /**
     * 获取飞书消息卡片模板
     *
     * @param event      工单通知事件
     * @param hasTrigger 是否有触发条件名称
     * @return 飞书消息卡片模板
     * @author XiaoYunSong <ys.xiao@idiaoyan.com>
     * @date 2022/2/18 14:27
     */
    protected static String getTemplate(TicketNotifyConfigEventEnum event, boolean hasTrigger) {
        if (hasTrigger) {
            return FEISHU_TEMPLATE_MAP.get(event);
        }
        return FEISHU_TEMPLATE_MAP_NONE.get(event);
    }
}
